package main

type TreeNode struct {
	Val int
	Left *TreeNode
	Right *TreeNode
}
/*
	完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ，求出该树的节点个数。
完全二叉树 的定义如下：在完全二叉树中，除了最底层节点可能没填满外，
其余每层节点数都达到最大值，并且最下面一层的节点都集中在该层最左边的若干位置。
若最底层为第 h 层，则该层包含 1~ 2h 个节点。

示例 1：
输入：root = [1,2,3,4,5,6]
输出：6

示例 2：
输入：root = []
输出：0
 */

func countNodes(root *TreeNode) int {
	/*
	思路一： 一直遍历右节点
	 */
	//count := 1    // 层数
	//if root == nil {
	//	return 0
	//}
	//if root.Left == nil && root.Right == nil {
	//	return 1
	//}
	//pre := root  //  标记上一个结点
	//for root != nil {
	//	if root.Left != nil {
	//		count ++
	//		root = root.Right
	//
	//		if count > 2 {
	//			pre = pre.Right
	//		}
	//	}else {
	//		break
	//	}
	//}
	//if pre.Right != nil {   // 满二叉树
	//	return int(math.Pow(2, float64(count))) - 1
	//}else {
	//	return int(math.Pow(2, float64(count))) - 2
	//}

	/*
	思路二：层次遍历
	 */
	count := 0
	if root == nil {
		return count
	}
	queue := []*TreeNode{root}
	for len(queue) > 0 {
		l := len(queue)
		count += l
		for i := 0; i < l; i ++ {
			if queue[i].Left != nil {
				queue = append(queue, queue[i].Left)
			}
			if queue[i].Right != nil {
				queue = append(queue, queue[i].Right)
			}
		}
		queue = queue[l:]
	}

	return count
}

func main() {

}
